/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.sgc.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;

import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.manager.ComunManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.ParametroManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.plan.view.util.ConstantesPlan;
import com.brain.segu.dto.RolDto;
import com.brain.segu.dto.UsuarioDto;
import com.brain.segu.manager.RolManager;
import com.brain.segu.manager.UsuarioManager;
import com.brain.segu.mbean.UsuarioMBean;
import com.brain.sgc.dto.ConocimientoAdicionalDto;
import com.brain.sgc.dto.ConocimientoInformaticaDto;
import com.brain.sgc.dto.EstudioDto;
import com.brain.sgc.dto.ExperienciaDto;
import com.brain.sgc.dto.IdiomaDto;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.dto.ReferenciaDto;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 * @author Greip Company
 * @since 29/01/2014
 * @version 1.0
 */
@Service
public class PersonaManager extends ComunManager<PersonaDto> implements Serializable {

    /**
     * Objeto que permite el acceso a la capa de datos
     *
     * @since 29/01/2014
     */
    @Resource
    private DAOGenerico<PersonaDto> springHibernateDao;
    /**
     * Guarda las acciones del sistema en un archivo de texto plano
     *
     * @since 29/01/2014
     */
    private static Logger logger = Logger.getLogger(OrganizacionManager.class);
    /**
     * Entidad actual del formulario
     *
     * @since 29/01/2014
     */
    private Long idEntidad = 209L;
    /**
     * Objeto de la clase RecursosManager (acceso a metodos utilitarios)
     *
     * @since 29/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    /**
     * Objeto de la clase UsuarioManager
     *
     * @since 29/01/2014
     */
    @Resource
    private UsuarioManager usuarioManager;
    /**
     * Objeto de la clase ParametroManager
     *
     * @since 29/01/2014
     */
    @Resource
    private ParametroManager parametroManager;
    /**
     * Objeto de la clase RolManager
     *
     * @since 29/01/2014
     */
    @Resource
    private RolManager rolManager;

    /**
     * Metodo que permite obtener el historial de las personas por filtro
     *
     * @since 29/01/2014
     * @param dtoFiltro filtro que se enviar al query
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonasHistorial(PersonaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            hqsql += " and e.nombreCompleto = '" + dtoFiltro.getNombreCompleto() + "'";
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            hqsql += " and e.numeroDocumento = '" + dtoFiltro.getNumeroDocumento() + "'";
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getSexoDto().getId());
        }
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener las persona que son usuarios del sisteama
     *
     * @param idUsuario filtro que se enviar para validar , si es un usuario del
     * sistema
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonaPorUsuarioSistema(Long idUsuario) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.usuarioSistemaDto.id = ?";
        listaParametros.add(idUsuario);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener la persona calificada mediante un filtro de
     * valores
     *
     * @return retorna el resultado de una consulta
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonaCalificada() throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.gt = ?";
        listaParametros.add(ConstantesSgc.Parametro.GESTION_TALENTO);
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.promedioFinal desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener una lista de personas que sean empleados de la
     * empresa para capacitacion
     *
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerEmpleadosCapa() throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener una lista de persona por filtro (Empleados)
     *
     * @param dtoFiltro filtro que se envia a la consulta
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerEmpleados(PersonaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            hqsql += " and e.nombreCompleto = '%" + dtoFiltro.getNombreCompleto() + "%'";
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            hqsql += " and e.numeroDocumento = '" + dtoFiltro.getNumeroDocumento() + "%'";
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getSexoDto().getId());
        }
        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            hqsql += " and e.puestoDto.id = ?";
            listaParametros.add(dtoFiltro.getPuestoDto().getId());
        }
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener todos los empleados
     *
     * @return retorna una lista de empleados de la tabla PersonaDto
     * @throws DAOException
     */
    public List<PersonaDto> obtenerEmpleadosSinFiltro() throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);
        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener una lista de personas para convocatoria , por
     * filtro
     *
     * @param dtoFiltro filtro que se envia al query para evaluarlo
     * @return retorna una lista de personas aptas para una convocatoria
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonasParaConvocatoria(PersonaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            hqsql += " and e.nombreCompleto = '%" + dtoFiltro.getNombreCompleto() + "%'";
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            hqsql += " and e.numeroDocumento = '" + dtoFiltro.getNumeroDocumento() + "%'";
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getSexoDto().getId());
        }
        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            hqsql += " and e.puestoDto.id = ?";
            listaParametros.add(dtoFiltro.getPuestoDto().getId());
        }
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener una lista de personas para una encuesta , por
     * filtro
     *
     * @param dtoFiltro filtro que se envia al query para evaluarlo
     * @return retorna una lista de personas aptas para una encuesta
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonasParaEncuesta(PersonaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            hqsql += " and e.nombreCompleto = '%" + dtoFiltro.getNombreCompleto() + "%'";
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            hqsql += " and e.numeroDocumento = '" + dtoFiltro.getNumeroDocumento() + "%'";
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getSexoDto().getId());
        }
        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }
        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            hqsql += " and e.puestoDto.id = ?";
            listaParametros.add(dtoFiltro.getPuestoDto().getId());
        }
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite obtener una lista de personas por filtro
     *
     * @param dtoFiltro filtro que se envia al query para evaluarlo
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonas(PersonaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            hqsql += " and e.nombreCompleto = '%" + dtoFiltro.getNombreCompleto() + "%'";
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            hqsql += " and e.numeroDocumento = '" + dtoFiltro.getNumeroDocumento() + "%'";
        }
        if (dtoFiltro.getEmail() != null && dtoFiltro.getEmail().length() != 0) {
            hqsql += " and e.email = '" + dtoFiltro.getEmail() + "%'";
        }
        if (dtoFiltro.getTelefonoCelular() != null && dtoFiltro.getTelefonoCelular().length() != 0) {
            hqsql += " and e.telefonoCelular = '" + dtoFiltro.getTelefonoCelular() + "%'";
        }
        if (dtoFiltro.getTelefonoFijo() != null && dtoFiltro.getTelefonoFijo().length() != 0) {
            hqsql += " and e.telefonoFijo = '" + dtoFiltro.getTelefonoFijo() + "%'";
        }

        if (dtoFiltro.getFechaNacimiento() != null) {
            hqsql += " and e.fechaNacimiento = '" + dtoFiltro.getFechaNacimiento() + "'";
        }
        if (dtoFiltro.getEstadoCivilDto().getId() != null && !dtoFiltro.getEstadoCivilDto().getId().equals(0L) && !dtoFiltro.getEstadoCivilDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.estadoCivilDto.id = ?";
            listaParametros.add(dtoFiltro.getEstadoCivilDto().getId());
        }
        //Se agrega estas lineas de codigo para obtener las personas de acuerdo a la empresa en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite instanciar un objeto y setear los atributos del dto de
     * la entidad
     *
     * @since 29/01/2014
     * @return retorna un dto
     */
    public PersonaDto inicializar() {
        PersonaDto dto = new PersonaDto();
        try {
            SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
            dto.setEmp(Boolean.FALSE);
            dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setTerminal(sessionMBean.getSessionTerminal());
            dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
            dto.setListaEstudios(new ArrayList<EstudioDto>());
            dto.setListaIdiomas(new ArrayList<IdiomaDto>());
            dto.setListaConocInformatica(new ArrayList<ConocimientoInformaticaDto>());
            dto.setListaConocAdicional(new ArrayList<ConocimientoAdicionalDto>());
            dto.setListaExperiencias(new ArrayList<ExperienciaDto>());
            dto.setListaReferencias(new ArrayList<ReferenciaDto>());
            if (sessionMBean.getOrganizacionDto() != null) {
                if (sessionMBean.getOrganizacionDto().getId() != null) {
                    //Obtenemos la moneda del pais de la organizacion   
                    dto.setTipoMonedaDto(sessionMBean.getOrganizacionDto().getMonedaDto());
                }
            }
            dto.setNacionalidadDto(sessionMBean.getEmpresaDto().getPaisDto());
            dto.setEmpresaDto(sessionMBean.getEmpresaDto());
            //Planillas
            dto.setCenRiesgoDto(parametroManager.obtenerPorId(parametroManager.getIdNinguno()));
            dto.setTipoRiesgoDto(parametroManager.obtenerPorId(parametroManager.getIdNinguno()));
            dto.setTipoMonedaDto(sessionMBean.getOrganizacionDto().getMonedaDto());
            dto.setEsSaludVida(Boolean.FALSE);
            dto.setRegimen(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_ONP);
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return dto;
    }

    public PersonaDto inicializarAux() {
        PersonaDto personaDto = new PersonaDto();
        //personaDto.setCatalogoParametroPadreDto(recursosManager.obtenerCatalogoParametroPorID(5L));
        //personaDto.setParametroPadreDto(recursosManager.obtenerParametroPorID(2L));
        return personaDto;
    }

    /**
     * Metodo que llenar un array para mostrarlo en un combo
     *
     * @return retorna un array lleno de datos
     */
    public SelectItem[] siTipoComision() {
        SelectItem[] si = new SelectItem[2];
        si[0] = new SelectItem(ConstantesPlan.ValoresConstantes.TIPO_COMISION_FLUJO_COD, ConstantesPlan.ValoresConstantes.TIPO_COMISION_FLUJO_DESC);
        si[1] = new SelectItem(ConstantesPlan.ValoresConstantes.TIPO_COMISION_SALDO_COD, ConstantesPlan.ValoresConstantes.TIPO_COMISION_SALDO_DESC);

        return si;
    }

    /**
     * Metodo que permite gestionar las acciones DML del objeto dto de la
     * entidad actual
     *
     * @since 29/01/2014
     * @return retorna la url de la pagina de financiamientoLetra o ún valor
     * nulo en caso pase un error
     */
    public String guardar(PersonaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        UsuarioMBean usuarioMBean = (UsuarioMBean) WebServletContextListener.getApplicationContext().getBean("usuarioMBean");
        UsuarioManager usuarioManager = (UsuarioManager) WebServletContextListener.getApplicationContext().getBean("usuarioManager");
        RolManager rolManager = (RolManager) WebServletContextListener.getApplicationContext().getBean("rolManager");
        if (sessionMBean.getAccion() == ConstantesSgc.Formulario.NUEVO) {
            try {
                String nombreCompleto = dto.getPrimerNombre() + " "
                        + (dto.getSegundoNombre() == null ? "" : dto.getSegundoNombre()) + " "
                        + dto.getApellidoPaterno() + " "
                        + dto.getApellidoMaterno();
                //Creamos el usuario del Sistema
                UsuarioDto usuarioDto = usuarioManager.inicializar();
                String contrasena = UtilCore.Seguridad.getCadenaAlfanumAleatoria(10);
                usuarioDto.setContrasenaActual(contrasena);
                usuarioDto.setLogin(dto.getEmail());
                RolDto rolDto = rolManager.obtenerRolEmpleadoPorEmpresa(dto.getEmpresaDto().getId());
                if (rolDto != null) {
                    usuarioDto.setRolDto(rolDto);
                    usuarioDto.setEmailLaboral(dto.getEmail());
                    usuarioDto.setDescripcion(nombreCompleto);
                    usuarioManager.guardar(usuarioDto);

                    if (usuarioDto.getId() != null) {
                        dto.setUsuarioSistemaDto(usuarioDto);
                        dto.setUsuarioCreacion(sessionMBean.getSessionUsuarioDto().getId());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        dto.setNombreCompleto(nombreCompleto);
                        UtilCore.General.toUpperCaseDto(dto);
                        nuevo(dto);

                        {
                            ArchivoMBean archivoMBean = (ArchivoMBean) WebServletContextListener.getApplicationContext().getBean("archivoMBean");

                            try {
                                if (dto.getArchivoFotoDto() != null && getIdEntidad() != null) {
                                    archivoMBean.grabarArchivo(dto.getArchivoFotoDto(), getIdEntidad(), dto.getId());
                                }
                            } catch (FileNotFoundException ex) {
                                recursosManager.showError("ARCHIVO NO ENCONTRADO :: " + ex.getMessage());
                                logger.error(ex);
                            } catch (IOException ex) {
                                recursosManager.showError("ERROR DE ENTRADA Y SALIDA :: " + ex.getMessage());
                                logger.error(ex);
                            }
                        }

                        //mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        //recursosManager.showMessage(mensajeTrx);
                        to = "";
                    } else {
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.no.usuario.persona");
                        recursosManager.showError(mensajeTrx);
                    }
                } else {
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.no.rol.emp");
                    recursosManager.showError(mensajeTrx);
                }
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);

                to = null;
            }
        } else if (sessionMBean.getAccion() == ConstantesSgc.Formulario.EDITAR) {
            try {
                dto.getUsuarioSistemaDto().setLogin(dto.getEmail());
                dto.getUsuarioSistemaDto().setEmailLaboral(dto.getEmail());
                usuarioMBean.editarEmail(dto.getUsuarioSistemaDto());
                dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
                dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminal(sessionMBean.getSessionTerminal());
                dto.setNombreCompleto(dto.getPrimerNombre() + " "
                        + (dto.getSegundoNombre() == null ? "" : dto.getSegundoNombre()) + " "
                        + dto.getApellidoPaterno() + " "
                        + dto.getApellidoMaterno());
                {
                    ArchivoMBean archivoMBean = (ArchivoMBean) WebServletContextListener.getApplicationContext().getBean("archivoMBean");

                    try {
                        if (dto.getArchivoFotoDto() != null && getIdEntidad() != null) {
                            archivoMBean.grabarArchivo(dto.getArchivoFotoDto(), getIdEntidad(), dto.getId());
                        }
                    } catch (FileNotFoundException ex) {
                        recursosManager.showError("ARCHIVO NO ENCONTRADO :: " + ex.getMessage());
                        logger.error(ex);
                    } catch (IOException ex) {
                        recursosManager.showError("ERROR DE ENTRADA Y SALIDA :: " + ex.getMessage());
                        logger.error(ex);
                    }
                }
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);

                to = "";
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);
                to = null;
            }
        }
        return to;
    }

    /**
     * Metodo que oermite obtener un Dto por id
     *
     * @since 29/01/2014
     * @param id parametro que se envia a la consulta para obtener
     * @return retorna el resultado de una consulta con el filtro anterior
     * @throws DAOException
     */
    public PersonaDto obtenerPersonaPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PersonaDto.class, id);
    }

    /**
     * Metodo que obtiene un Dto
     *
     * @since 29/01/2014
     * @param id identificador o codigo en la tabla a obtener
     * @return retorna un Dto lleno de datos en caso que encuentre coincidencias
     * con el parámetro enviado
     */
    public PersonaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PersonaDto.class, id);
    }

    /**
     * Metodo que permite obtener una persona por el email
     *
     * @param email correo electronico que se envia como filtro
     * @return retorna la(s) persona(s) coincidentes
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonaPorEmail(String email) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select p from PersonaDto as p where ";
        hqsql += " p.email = '" + email + "'";
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and p.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerPersonaTipoYNroDocumento(Long tipoDocumento, String numeroDocumento) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select p from PersonaDto as p where ";
        hqsql += " p.tipoDocumentoDto.id = " + tipoDocumento;
        hqsql += " and p.numeroDocumento = " + numeroDocumento;
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and p.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que obtiene todos los datos coincidentes con el filtro , además
     * permite manejar el orden de los datos
     *
     * @since 29/01/2014
     * @param filtros es el objeto de la Interfaz Map , que envía un mapa con 2
     * parámetros
     * @param orden es el objeto de la Interfaz Map , que envía un mapa con 2
     * parámetros
     * @return retorna una lista con todos los datos de la entidad coincidentes
     * con el filtro ordenado manualmente
     */
    public List<PersonaDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PersonaDto.class, filtros, orden);
    }

    /**
     * Metodo que permite mostrar una lista de personas por filtro
     *
     * @since 29/01/2014
     * @param sqr filtro que se aplica al query
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerPersonasAutocomplete(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        hqsql += " and (e.puestoDto.estadoDto.id = ?)";
        listaParametros.add(ConstantesSgc.Parametro.PUESTO_ESTADO_HABILITADO);

        hqsql += " and ( upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%' )";
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo que permite mostrar una lista de personas por filtro
     *
     * @since 29/01/2014
     * @param sqr filtro que se aplica al query
     * @return retorna una lista de personas
     * @throws DAOException
     */
    public List<PersonaDto> obtenerEmpleadoAutocomplete(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.epm=1 ";

        hqsql += " and (e.puestoDto.estadoDto.id = ?)";
        listaParametros.add(ConstantesSgc.Parametro.PUESTO_ESTADO_HABILITADO);

        hqsql += " and ( upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%' )";
        //Se agrega estas lineas de codigo para obtener las evaluaciones de acuerdo a la organizacion en sesion
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregado para propietarios
        hqsql += " and exists(select 'X' from PropietarioDto as prop ";
        hqsql += " where prop.pk.organizacionDto.id = ? ";
        hqsql += " and prop.pk.entidad = ? ";
        hqsql += " and prop.pk.registro = e.usuarioSistemaDto.id)";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        listaParametros.add(usuarioManager.getIdEntidad());

        hqsql += " order by e.apellidoPaterno asc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public Long getIdEntidad() {
        return idEntidad;
    }
}
